package com.example.demo.mapper;

import com.example.demo.entity.ArticleInfo;
import com.example.demo.entity.VO.ArticleInfoVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.core.parameters.P;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-06-06
 * Time: 17:10
 */

// 关于文章操作的持久层
@Mapper
public interface ArticleMapper {

    // 添加文章
    int addArticle(ArticleInfo articleInfo);

    // 根据id查询文章, 并通过uid 确认归属人
    ArticleInfo getArticleByIdAndUid(@Param("id") Integer id, @Param("uid") Integer uid);

    // 根据文章 id 修改文章
    int updateArticle(ArticleInfo articleInfo);

    // 根据文章自增 id 联表查询
    ArticleInfoVO getDetailArticle(@Param("id") Integer id);

    // 根据 id 查询阅读量, 并在访问时 +1
    int addvisits(@Param("id") Integer id);

    // 查询指定用户所有文章数量
    List<ArticleInfo> countArticle(@Param("uid") Integer uid);

    // 根据文章 id 查询文章对象
    ArticleInfo selectArticleById(@Param("id") Integer id);

    // 根据用户 id 查询该用户的所有文章, 由于用户 id  和文章 uid 关联
    List<ArticleInfo> getAllArticle(@Param("id") Integer id);


    // 删除指定id 用户 的指定 uid 文章
    int del(@Param("id") Integer id, @Param("uid") Integer uid);

    // 根据当前页 pageSize 和偏移量 offset 返回要展示的文章
    List<ArticleInfo> getAllArticleByPage(@Param("pageSize") Integer pageSize,
                                          @Param("offset") Integer offset, @Param("state") Integer state);

    // 根据当前页面 pageSize 和偏移量 offset 返回当前用户已发表的文章
    List<ArticleInfo> getAllArticleByPageFromUser(@Param("pageSize") Integer pageSize, @Param("offset") Integer offset,
                                                  @Param("uid") Integer uid, @Param("state") Integer state);

    // 查询文章总数
    int getArticle(@P("state") Integer state);

    // 查询当前用户文章总数
    int getArticleFromUser(@Param("uid") Integer uid, @Param("state")Integer state);

    // 根据文章自增 id 多表联查返回增强对象包含文章归属人的头像路径
    ArticleInfoVO getImagePath(@Param("id") Integer id);

    // 新增文章, 并设置 state 为 2 表示未发布状态
    int saveArticle(ArticleInfo articleInfo);

    // 分页器展示当前用户未发表的草稿
    List<ArticleInfo> getAllArticleByPageNotSub(@Param("pageSize") Integer pageSize, @Param("offset") Integer offset,
                                                @Param("uid") Integer uid, @Param("state") Integer state);

    // 查询当期用户未发表的文章(草稿) 总数
    int getArticleNotSub(@Param("uid") Integer uid, @Param("state")Integer state);

    // 自动保存, 第一次使用插入数据,之后执行更新操作
    int autoSaveArticle(ArticleInfo articleInfo);
}

